package jp.oesf.malfoy.dao;

import java.util.List;

import jp.oesf.malfoy.model.RssBean;
import jp.oesf.malfoy.model.RssRirekiBean;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class RssEntity {
	
	private Context context ;

	/*
	 * コンストラクタ
	 * 
	 * @param Context
	 */
	public RssEntity(Context context){
		this.context = context;
	}
	
	/*
	 * RSS_Rireki,RSSテーブル登録
	 * 
	 * @param RssRirekiBean
	 * @return result RSS登録件数 -1失敗
	 */
	public long setData(RssRirekiBean rssRirekiBean){
		long result;
		String url = rssRirekiBean.getUrl();
		
		//RSS履歴データ取得
		int key = getRssRireki(url);
		Log.v(getClass().getSimpleName()+ " setData","key="+key);
		if (key != -1 ){
			//RSSデータ削除
			result = delRssData(key);
			if (result != -1){ 
				result = setRssData(key,rssRirekiBean);
			}
		}
		else{
			//データ登録なしの場合
			result = setRssRirekiData(rssRirekiBean);
		}
		
		return result;
	}
	
	/*
	 * RSSRirekiテーブル登録
	 * 
	 * @param RssRirekiBean
	 * @return long　-1失敗
	 */
	private long setRssRirekiData(RssRirekiBean rssRirekiBean){

		RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
	    SQLiteDatabase database = databaseOpenHelper.getWritableDatabase();

	    //Beanからデータ取得
	    String url = rssRirekiBean.getUrl();
	    
	    //insertデータの設定
	    ContentValues values = new ContentValues();
	    
	    values.put(RssSQLiteOpenHelper.RIREKI_URL,url );
	    values.put(RssSQLiteOpenHelper.RIREKI_HINDO,1 );
	    
	    //データを追加する
	    long result = database.insert(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,null, values);
	    Log.v(getClass().getSimpleName(),"result:" + result);
	    if (result == -1){
	    	//登録失敗なのでエラーを返す！
	    	Log.v(getClass().getSimpleName()+"setRssRirekiData","insert 失敗");
	    }
	    else{
	    	//データを検索してキーを取得	
	    	int key = getRssRireki(url);
	    	//取得したキーでデータを登録
	    	setRssData(key,rssRirekiBean);
	    }

	    databaseOpenHelper.close();	    
		return result;
	}

	/*
	 * RSSテーブル登録
	 * 
	 * @param int key 外部キー
	 * @param RssRirekiBean 
	 */
	private int setRssData(int key,RssRirekiBean rssRirekiBean){
	    RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
	    SQLiteDatabase database = databaseOpenHelper.getWritableDatabase();

	    List<RssBean> rssBeans =  rssRirekiBean.getListRssData();
	    long result = 0;
	    int len = rssBeans.size();
	    if (len != 0){
	    	for(int i = 0;i < len ;i++){
	    	    //insertデータの設定
	    	    ContentValues values = new ContentValues();
	    	    values.put(RssSQLiteOpenHelper.RSS_KEY,key );
	    	    values.put(RssSQLiteOpenHelper.RSS_TITLE,rssBeans.get(i).getTitle());
	    	    values.put(RssSQLiteOpenHelper.RSS_LINK,rssBeans.get(i).getLink() );
	    	    values.put(RssSQLiteOpenHelper.RSS_DESCRI,rssBeans.get(i).getDescription() );
	    	    values.put(RssSQLiteOpenHelper.RSS_PUBDATA,rssBeans.get(i).getPubDate() );
	    	    values.put(RssSQLiteOpenHelper.RSS_CATEGORY,rssBeans.get(i).getCategory() );

	    	    //データを追加する
	    	    result = database.insert(RssSQLiteOpenHelper.RSS_TABLE,null, values);
	    	    Log.v(getClass().getSimpleName(),"result:" + result);
	    	    if (result == -1){
	    	    	//登録失敗なのでエラーを返す！
	    	    	Log.v(getClass().getSimpleName()+" setRssData","insert 失敗");
	    	    	break;
	    	    }
	    	    else{
	    	    	Log.v(getClass().getSimpleName()+" setRssData","insert 成功!!");
	    	    }
	    	}
	    }
	    databaseOpenHelper.close();	    
	    return (int)result;
	}
	
	//RSSテーブル検索
//	public boolean isRssData(int rireki_key){
//		boolean retBool = false;
//    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
//    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();
//
//		try{
//	    	//検索する
//	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_TABLE,
//	    			null,"rireki_key=" + rireki_key,
//	    			null, null, null, null);
//	    	if (cursor != null){
//	    		//startManagingCursor(cursor);
//	    		Log.v(getClass().getSimpleName(),"[データ件数:"+ cursor.getCount() + "件]");
//	    		
//	    		if (cursor.getColumnCount() > 0){
//	    			retBool = true;
//	    		}
//	    	}
//	    	cursor.close();
//	    	
//	    }catch (Exception e) {
//    		Log.e(getClass().getSimpleName()+ " isRssData",e.toString());
//		}
//	    
//	    finally{
//	    	//データベースから切断
//	    	database.close();
//	    	//Log.v(getClass().getSimpleName(),"Succeeded in close the databese.");
//	    }
//		return retBool;
//	}
	
	//
	/*
	 * RssRirekiテーブル検索
	 * 
	 * @param String URL
	 * @return int _id 
	 */
	private int getRssRireki(String url){
    	// 読込専用のSQLiteDatabaseオブジェクトを所得する。
		int id = -1;
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();

		try{
	    	//検索する
	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,
	    			null,RssSQLiteOpenHelper.RIREKI_URL + "=?",
	    			new String[]{url}, null, null, null);
	    	if (cursor != null){
	    		//startManagingCursor(cursor);
	    		Log.v(getClass().getSimpleName(),"[データ件数:"+ cursor.getCount() + "件]");
	    		
	    		while(cursor.moveToNext()){
	    			
	    			//_id を取得
	    			id = cursor.getInt(cursor.getColumnIndex("_id"));
	    			
	    			Log.v(getClass().getSimpleName(),"id:"+ id);
	    		}
	    	}
	    	cursor.close();
	    	
	    }catch (Exception e) {
	    	Log.e(getClass().getSimpleName(),Log.getStackTraceString(e));
		}
	    
	    finally{
	    	//データベースから切断
	    	database.close();
	    	//Log.v(getClass().getSimpleName(),"Succeeded in close the databese.");
	    }
	    return id;
	}
	
	//
	/* RssRirekiテーブルからhindoを取得
	 * 
	 * @param int id
	 * @return int hindo
	 */
	private int getRssRirekiHindo(int id){
    	// 読込専用のSQLiteDatabaseオブジェクトを所得する。
		int hindo = -1;
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();

		try{
	    	//検索する
	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,
	    			null,"_id=" + id,
	    			null, null, null, null);
	    	if (cursor != null){
	    		//startManagingCursor(cursor);
	    		Log.v(getClass().getSimpleName(),"[データ件数:"+ cursor.getCount() + "件]");
	    		
	    		while(cursor.moveToNext()){
	    			
	    			//hindo を取得
	    			hindo = cursor.getInt(cursor.getColumnIndex(RssSQLiteOpenHelper.RIREKI_HINDO));
	    			
	    			Log.v(getClass().getSimpleName(),"hindo:"+ hindo);
	    		}
	    	}
	    	cursor.close();
	    	
	    }catch (Exception e) {
	    	Log.e(getClass().getSimpleName(),Log.getStackTraceString(e));
		}
	    
	    finally{
	    	//データベースから切断
	    	database.close();
	    	//Log.v(getClass().getSimpleName(),"Succeeded in close the databese.");
	    }
	    return hindo;
	}

	//RSSRirekiデータ削除 いらないかも
//	public long delRssRirekiData(String url){
//    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
//    	SQLiteDatabase database = databaseOpenHelper.getWritableDatabase();
//
//    	//削除する
//    	long result = database.delete(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,
//    			"url=" + url,null);
//    	//データベースから切断
//    	if (databaseOpenHelper != null){
//    		databaseOpenHelper.close();
//    	}
//    	if (database != null){
//    		database.close();
//    	}
//
//    	if (result != -1){
//        	Log.v(getClass().getSimpleName(),"RSSRirekiデータ削除:url=" + url);
//    	}
//    	return result;		
//	}

	//
	/* RSSテーブルデータ削除
	 * 
	 * @param int key
	 * @return long
	 */
	private long delRssData(int key){
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getWritableDatabase();

    	//削除する
    	long result = database.delete(RssSQLiteOpenHelper.RSS_TABLE,
    			RssSQLiteOpenHelper.RSS_KEY + "=" + key,null);
    	//データベースから切断
    	if (databaseOpenHelper != null){
    		databaseOpenHelper.close();
    	}
    	if (database != null){
    		database.close();
    	}

    	if (result != -1){
        	Log.v(getClass().getSimpleName(),"RSSデータ削除:rireki_key=" + key);
    	}
    	return result;		
	}
	
	/*
	 * 履歴一覧全取得
	 *  
	 * @param List<RssRirekiBean>
	 * @return　long 取得件数 -1失敗
	 */
	public long selectAllRirekiData(List<RssRirekiBean> ldata){
    	// 読込専用のSQLiteDatabaseオブジェクトを所得する。
		int id = -1;
		String url;
		int hindo;
		long result = -1;
		
		//List<RssRirekiBean> ldata = new ArrayList<RssRirekiBean>();
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();

		try{
	    	//検索する
	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,
	    			null,null,null, null, null, RssSQLiteOpenHelper.RIREKI_HINDO + " DESC");
	    	if (cursor != null){
	    		//startManagingCursor(cursor);
	    		Log.v(getClass().getSimpleName(),"[データ件数:"+ cursor.getCount() + "件]");
	    		result = cursor.getCount();
	    		
	    		while(cursor.moveToNext()){
	    			RssRirekiBean testData = new RssRirekiBean();
	    			
	    			//_id を取得
	    			id = cursor.getInt(cursor.getColumnIndex("_id"));
	    			url = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RIREKI_URL));
	    			hindo = cursor.getInt(cursor.getColumnIndex(RssSQLiteOpenHelper.RIREKI_HINDO));
	    			Log.v(getClass().getSimpleName(),"id:"+ id);
	    			testData.setId(id);
	    			testData.setUrl(url);
	    			testData.setHind(hindo);
	    			ldata.add(testData);
	    		}
	    	}
	    	cursor.close();
	    	
	    }catch (Exception e) {
	    	Log.e(getClass().getSimpleName(),Log.getStackTraceString(e));
	    	result = -1;
		}
	    
	    finally{
	    	//データベースから切断
	    	database.close();
	    	//Log.v(getClass().getSimpleName(),"Succeeded in close the databese.");
	    }
	    return result;
	}		
	
	/*
	 * RSSテーブルデータ取得 1件用（_id と 外部キーで取得）
	 * 
	 * @param int id _id 
	 * @param String key 外部キー
	 * @param RssBean
	 * @return　long 取得件数 -1失敗
	 */
	public long selectRssData(int id ,String key,RssBean ldata ){
		String title;
		String link;
		String description;
		String pubDate;
		String category;
		long result = -1;
		//RssBean ldata = new RssBean();
		// 読込専用のSQLiteDatabaseオブジェクトを所得する。
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();
    	String[] whereData = new String[2];
    	whereData[0] = String.valueOf(id);
    	whereData[1] = key;
    	
		try{
			String where = "_id=? and " + RssSQLiteOpenHelper.RSS_KEY + "=?";
	    	//検索する
	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_TABLE,
	    			null,where, whereData, null, null, null);
	    	if (cursor != null){
	    		//startManagingCursor(cursor);
	    		Log.v(getClass().getSimpleName(),"[データ件数:"+ cursor.getCount() + "件]");
	    		result = cursor.getCount();
	    		while(cursor.moveToNext()){
	    			
	    			//データ を取得
	    			id = cursor.getInt(cursor.getColumnIndex("_id"));
	    			title = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_TITLE));
	    			link = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_LINK));
	    			description = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_DESCRI));
	    			pubDate = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_PUBDATA));
	    			category = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_CATEGORY));
	    			
	    			Log.v(getClass().getSimpleName(),"id:"+ id);
	    			ldata.setId(String.valueOf(id));
	    			ldata.setTitle(title);
	    			ldata.setLink(link);
	    			ldata.setDescription(description);
	    			ldata.setPubDate(pubDate);
	    			ldata.setCategory(category);
	    			ldata.setRireki_key(key);
	    		}
	    	}
	    	cursor.close();
	    	
	    }catch (Exception e) {
	    	Log.e(getClass().getSimpleName(),Log.getStackTraceString(e));
	    	result = -1;
		}
	    
	    finally{
	    	//データベースから切断
	    	database.close();
	    }
	    return result;
	}
	
	/*
	 * RSSテーブルデータ検索一覧表示用(URLのみで取得)
	 * @param String URL
	 * @param List<RssBean>
	 * @return　long 取得件数 -1失敗
	 * 
	 */
	public long selectAllRssData(String url ,List<RssBean> rssBeans){
		long result = -1;
		//Rss_rirekiからURLでキーを検索する
		int id = getRssRireki(url);
		if (id != -1){
			//RSSテーブルデータ検索一覧表示用呼び出し
			result = selectAllRssData(id,rssBeans);
		}
		return result;
	}
	
	/* 
	 * RSSテーブルデータ検索一覧表示用(外部キーのみで取得)
	 * 
	 * @param int key 外部キー
	 * @param List<RssBean>
	 * @return　long 取得件数 -1失敗
	 */
	public long selectAllRssData(int key,List<RssBean> rssBeans){

		long result = -1;
		//頻度をインクリメントする
		//long ret = updateHindoRssRireki(context,id);
		updateHindoRssRireki(key);
		int id;
		String title;
		String link;
		String description;
		String pubDate;
		String category;
		
		//List<RssBean> rssBeans = new ArrayList<RssBean>();
		
		// 読込専用のSQLiteDatabaseオブジェクトを所得する。
    	RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
    	SQLiteDatabase database = databaseOpenHelper.getReadableDatabase();
    	String[] whereData = new String[1];
    	whereData[0] = String.valueOf(key);
    	
		try{
	    	//検索する
	    	Cursor cursor = database.query(RssSQLiteOpenHelper.RSS_TABLE,
	    			null,RssSQLiteOpenHelper.RSS_KEY + "=?", whereData, null, null, "_id");
	    	if (cursor != null){
	    		//startManagingCursor(cursor);
	    		Log.v(getClass().getSimpleName() + "selectAllRssData","[データ件数:"+ cursor.getCount() + "件]");
	    		result = cursor.getCount();
	    		while(cursor.moveToNext()){
	    			RssBean ldata = new RssBean();
	    			//データ を取得
	    			id = cursor.getInt(cursor.getColumnIndex("_id"));
	    			title = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_TITLE));
	    			link = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_LINK));
	    			description = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_DESCRI));
	    			pubDate = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_PUBDATA));
	    			category = cursor.getString(cursor.getColumnIndex(RssSQLiteOpenHelper.RSS_CATEGORY));
	    			
	    			Log.v(getClass().getSimpleName(),"id:"+ id);
	    			ldata.setId(String.valueOf(id));
	    			ldata.setTitle(title);
	    			ldata.setLink(link);
	    			ldata.setDescription(description);
	    			ldata.setPubDate(pubDate);
	    			ldata.setCategory(category);
	    			ldata.setRireki_key(String.valueOf(key));
	    			rssBeans.add(ldata);
	    		}
	    	}
	    	cursor.close();
	    	
	    }catch (Exception e) {
	    	Log.e(getClass().getSimpleName(),Log.getStackTraceString(e));
	    	result = -1;
		}
	    
	    finally{
	    	//データベースから切断
	    	database.close();
	    }
	    return result;
	}
	
	/*
	 * RssRireki使用頻度update処理
	 * 
	 * @param int id _id
	 * @return long -1失敗
	 */
	private long updateHindoRssRireki(int id){
		
		//idからRssRirekiを取得
		int hindo = getRssRirekiHindo(id);
		hindo = hindo + 1;

		RssSQLiteOpenHelper databaseOpenHelper = new RssSQLiteOpenHelper(context);
	    SQLiteDatabase database = databaseOpenHelper.getWritableDatabase();
	    
	    //insertデータの設定
	    ContentValues values = new ContentValues();
	    values.put(RssSQLiteOpenHelper.RIREKI_HINDO,hindo );
	    
	    //データを追加する
	    long result = database.update(RssSQLiteOpenHelper.RSS_RIREKI_TABLE,values,"_id="+id,null);
	    Log.v(getClass().getSimpleName(),"result:" + result);
	    if (result == -1){
	    	//登録失敗なのでエラーを返す！
	    	Log.v(getClass().getSimpleName()+"setRssRirekiData","insert 失敗");
	    }

	    databaseOpenHelper.close();	    
		return result;		
	}
}
